Guide Bella through a clear 14-day gut wellness reset with one practical action each day.
Gut Health Score72Digestive Balance
Current Day
◎
Day 1
Your next recommended step
Completed
✓
0/14
Daily missions finished
Current Streak
↗
0 days
Consistency builds confidence
Primary Focus
◌
Digestive Balance
From the wellness assessment
Today’s Mission
Build the baseline
Observe what is happening before changing the routine.
Day1
Build the Baseline
Understand the current routine before changing anything.
8 minutes1 lesson1 reflection
The 14-Day Reset
A calmer plan for Bella.
Each day introduces one clear idea, one practical action and one reflection. The lesson engine will plug directly into this framework.
Progress Intelligence
See the momentum building.
Your baseline assessment and program completion are brought together in one simple view.
Program Completion0%0 of 14 daily missions completed
Assessment Pillars
Wellness snapshot
Bonus Library
Support tools, ready when needed.
Premium resources designed to support the daily experience on screen and in print.
Personalisation
Make the experience yours.
Update the details shown throughout the Wellness Hub.
Owner Profile
Your details
Assessment Connection
Personalised baseline
The Hub automatically reads the existing Dog Gut Health assessment stored in this browser.
#
Gut Health ScoreCurrent assessment baseline
72
◎
Primary FocusRecommended attention area
Digestive Balance
Saved
(()=>{
const ROOT=document.getElementById('dgh-os-v2'); if(!ROOT)return;
const ASSESSMENT_KEY='dghWellnessExperienceV1', OS_KEY='dghOperatingSystemV2';
const days=[
['Build the Baseline','Understand the current routine before changing anything.'],['Read the Signals','Learn what stool, appetite and energy patterns may reveal.'],['Hydration First','Create a simple hydration routine that is easy to maintain.'],['Audit the Bowl','Review the current food routine with fresh eyes.'],['Treat Check','Identify hidden extras that can complicate consistency.'],['Slow the Change','Understand why gradual adjustments matter.'],['The First Review','Pause, compare and capture the first seven days.'],['Routine Over Perfection','Create a repeatable feeding rhythm.'],['Support the Environment','Reduce avoidable stress around meals and rest.'],['Track What Matters','Focus on meaningful trends rather than isolated moments.'],['Build Better Consistency','Strengthen the habits already working.'],['Spot Your Triggers','Identify possible routine patterns worth discussing.'],['Create the Maintenance Plan','Design the next 30 days around what you learned.'],['Complete the Reset','Review progress and prepare the wellness summary.']];
const resources=[['💩','Stool Score Guide','A visual reference for recording daily stool quality.'],['🛒','Smart Shopping List','A practical checklist for routine-friendly essentials.'],['🍽','Food Audit Worksheet','Map the current food, treat and supplement routine.'],['📈','Progress Tracker','Capture changes across digestion, energy and consistency.'],['🦴','Treat Review Guide','Audit frequency, ingredients and portions.'],['📝','Daily Journal','Printable prompts to accompany the experience.']];
const defaults={owner:'Mary',dog:'Bella',score:72,focus:'Digestive Balance',completed:0,streak:0,currentDay:1,pillars:{Digestion:72,Hydration:66,Routine:74,Energy:69}};
let state={...defaults};
const parse=x=>{try{return JSON.parse(x)}catch(e){return null}};
const readAssessment=()=>{const d=parse(localStorage.getItem(ASSESSMENT_KEY));if(!d)return{};const a=d.answers||{},r=d.results||{};return{owner:a.name||a.ownerName||a.yourName,dog:a.dogName||a.petName||a.dog,score:Number(r.overall||r.score||d.score)||undefined,focus:r.focus||r.strongest||undefined,pillars:r.pillars||undefined}};
function load(){state={...defaults,...readAssessment(),...(parse(localStorage.getItem(OS_KEY))||{})};state.completed=Math.max(0,Math.min(14,Number(state.completed)||0));state.currentDay=Math.max(1,Math.min(14,Number(state.currentDay)||state.completed+1));state.score=Math.max(0,Math.min(100,Number(state.score)||72));state.streak=Math.max(0,Number(state.streak)||0);if(!state.pillars||typeof state.pillars!=='object')state.pillars=defaults.pillars}
function save(){localStorage.setItem(OS_KEY,JSON.stringify(state))}
function text(sel,val){ROOT.querySelectorAll(sel).forEach(el=>el.textContent=val)}
function toast(msg){const el=ROOT.querySelector('#toast');el.textContent=msg;el.classList.add('show');clearTimeout(window.__dghToast);window.__dghToast=setTimeout(()=>el.classList.remove('show'),2400)}
function navigate(view){ROOT.querySelectorAll('.view').forEach(el=>el.classList.toggle('active',el.dataset.panel===view));ROOT.querySelectorAll('[data-view]').forEach(el=>el.classList.toggle('active',el.dataset.view===view));window.scrollTo({top:0,behavior:'smooth'})}
function renderNext(){const wrap=ROOT.querySelector('#next-days');wrap.innerHTML='';for(let i=0;i<3;i++){const idx=Math.min(13,state.currentDay-1+i),done=idx<state.completed,current=idx===state.currentDay-1,row=document.createElement('div');row.className='journey-row';row.innerHTML=`
${done?'Done':current?'Ready':'Locked'}`;wrap.appendChild(row)}}
function renderProgram(){const grid=ROOT.querySelector('#program-grid');grid.innerHTML='';days.forEach((day,idx)=>{const no=idx+1,done=idx<state.completed,ready=no<=state.currentDay,card=document.createElement('article');card.className='program-card '+(!ready?'locked':'');card.innerHTML=`
${done?'✓':no}
${day[0]}
${day[1]}
`;card.querySelector('button').addEventListener('click',()=>ready&&toast('The Day '+no+' lesson engine is the next build stage.'));grid.appendChild(card)})}
function renderPillars(){const wrap=ROOT.querySelector('#focus-bars');wrap.innerHTML='';Object.entries(state.pillars).slice(0,5).forEach(([name,val])=>{const n=Math.max(0,Math.min(100,Number(val)||0)),el=document.createElement('div');el.innerHTML=`
${name}${n}
`;wrap.appendChild(el)})}
function renderLibrary(){const grid=ROOT.querySelector('#library-grid');grid.innerHTML='';resources.forEach(item=>{const card=document.createElement('article');card.className='resource';card.innerHTML=`
${item[0]}
${item[1]}
${item[2]}
`;card.querySelector('button').addEventListener('click',()=>toast('This resource will be activated with the full library.'));grid.appendChild(card)})}
function render(){const pct=Math.round(state.completed/14*100);text('[data-owner]',state.owner);text('[data-dog]',state.dog);text('[data-score]',state.score);text('[data-focus]',state.focus);text('[data-completed]',state.completed);text('[data-streak]',state.streak);text('[data-current-day]',state.currentDay);text('[data-percent]',pct);text('[data-initials]',(state.owner[0]||'M')+(state.dog[0]||'B'));ROOT.querySelectorAll('[data-progress]').forEach(el=>el.style.width=pct+'%');ROOT.querySelector('#score-ring').style.setProperty('--angle',(state.score*3.6)+'deg');const today=days[state.currentDay-1]||days[13];text('[data-today-title]',today[0]);text('[data-today-desc]',today[1]);ROOT.querySelector('#owner-input').value=state.owner;ROOT.querySelector('#dog-input').value=state.dog;renderNext();renderProgram();renderPillars();renderLibrary()}
ROOT.querySelectorAll('[data-view]').forEach(btn=>btn.addEventListener('click',()=>navigate(btn.dataset.view)));
ROOT.querySelectorAll('[data-go]').forEach(btn=>btn.addEventListener('click',()=>navigate(btn.dataset.go)));
ROOT.querySelector('#save-profile').addEventListener('click',()=>{state.owner=ROOT.querySelector('#owner-input').value.trim()||'Mary';state.dog=ROOT.querySelector('#dog-input').value.trim()||'Bella';save();render();toast('Profile saved successfully.')});
ROOT.querySelector('#notify').addEventListener('click',()=>toast('You are all caught up.'));
const hour=new Date().getHours();ROOT.querySelector('#greeting').textContent=hour<12?'Good morning':hour<18?'Good afternoon':'Good evening';
load();render();
})();