-
This commit is contained in:
@@ -0,0 +1,353 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
require __DIR__ . '/../app/bootstrap.php';
|
||||
app_db();
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Neon Health Tracker</title>
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body data-theme="dark" data-accent="green">
|
||||
<div class="app-shell">
|
||||
<header class="topbar">
|
||||
<div class="brand-block">
|
||||
<div class="brand-mark" aria-hidden="true">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</div>
|
||||
<div>
|
||||
<h1>Neon Health Tracker</h1>
|
||||
<p id="profileFocus">Loading profile</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="topbar-controls">
|
||||
<label class="field compact-field">
|
||||
<span>Profile</span>
|
||||
<select id="profileSelect"></select>
|
||||
</label>
|
||||
<div class="segmented" aria-label="Planner scope">
|
||||
<button type="button" data-view="daily">Daily</button>
|
||||
<button type="button" data-view="weekly">Weekly</button>
|
||||
<button type="button" data-view="monthly">Monthly</button>
|
||||
</div>
|
||||
<label class="field date-field">
|
||||
<span>Date</span>
|
||||
<input id="datePicker" type="date">
|
||||
</label>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="control-strip">
|
||||
<div class="range-copy" id="rangeCopy">Loading range</div>
|
||||
<div class="theme-controls">
|
||||
<div class="toggle-group" aria-label="Theme mode">
|
||||
<button type="button" id="darkModeButton">Dark</button>
|
||||
<button type="button" id="lightModeButton">Light</button>
|
||||
</div>
|
||||
<div class="accent-swatches" aria-label="Accent color">
|
||||
<button type="button" data-accent="green" title="Green"></button>
|
||||
<button type="button" data-accent="blue" title="Blue"></button>
|
||||
<button type="button" data-accent="red" title="Red"></button>
|
||||
<button type="button" data-accent="pink" title="Pink"></button>
|
||||
<button type="button" data-accent="orange" title="Orange"></button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="summary-grid" id="summaryGrid" aria-live="polite"></section>
|
||||
|
||||
<section class="panel admin-panel" id="adminPanel" hidden>
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Admin</p>
|
||||
<h2>User Management</h2>
|
||||
</div>
|
||||
<button class="text-button" type="button" id="newAdminUserButton">New profile</button>
|
||||
</div>
|
||||
<div class="admin-stats" id="adminStats"></div>
|
||||
<div class="admin-layout">
|
||||
<div class="admin-user-list" id="adminUserList"></div>
|
||||
<form class="admin-editor" id="adminUserForm">
|
||||
<input type="hidden" name="target_user_id">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Profile Editor</p>
|
||||
<h2 id="adminUserFormTitle">Create Profile</h2>
|
||||
</div>
|
||||
<button class="text-button" type="button" id="clearAdminUserFormButton">Clear</button>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Name</span><input name="name" required></label>
|
||||
<label class="field"><span>Email</span><input name="email" type="email"></label>
|
||||
<label class="field"><span>Role</span><select name="role"><option value="member">member</option><option value="admin">admin</option></select></label>
|
||||
<label class="field"><span>Status</span><select name="status"><option value="active">active</option><option value="inactive">inactive</option></select></label>
|
||||
<label class="field"><span>Phone</span><input name="phone" type="tel"></label>
|
||||
<label class="field"><span>Birthday</span><input name="birthday" type="date"></label>
|
||||
<label class="field"><span>Height in</span><input name="height_in" type="number" min="0" step="0.5"></label>
|
||||
<label class="field"><span>Training level</span><select name="training_level"><option></option><option>Beginner</option><option>Intermediate</option><option>Advanced</option><option>Competitive</option></select></label>
|
||||
<label class="field"><span>Theme</span><select name="theme_mode"><option>dark</option><option>light</option></select></label>
|
||||
<label class="field"><span>Accent</span><select name="theme_accent"><option>green</option><option>blue</option><option>red</option><option>pink</option><option>orange</option></select></label>
|
||||
<label class="field wide"><span>Fitness focus</span><input name="fitness_focus" placeholder="Strength, endurance, recovery"></label>
|
||||
<label class="field wide"><span>Emergency contact</span><input name="emergency_contact" placeholder="Name and phone"></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save profile</button>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="workspace-grid">
|
||||
<div class="panel planner-panel">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Planner</p>
|
||||
<h2>Workout Schedule</h2>
|
||||
</div>
|
||||
<button class="text-button" type="button" data-jump="#workoutForm">Add workout</button>
|
||||
</div>
|
||||
<div class="timeline" id="workoutTimeline"></div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Balance</p>
|
||||
<h2>Nutrition Target vs Actual</h2>
|
||||
</div>
|
||||
<button class="text-button" type="button" data-jump="#nutritionLogForm">Log meal</button>
|
||||
</div>
|
||||
<div id="nutritionCompare"></div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Plan Library</p>
|
||||
<h2>Routines</h2>
|
||||
</div>
|
||||
<button class="text-button" type="button" data-jump="#routineForm">Add routine</button>
|
||||
</div>
|
||||
<div class="routine-list" id="routineList"></div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Recovery Stack</p>
|
||||
<h2>Supplements</h2>
|
||||
</div>
|
||||
<button class="text-button" type="button" data-jump="#supplementLogForm">Log dose</button>
|
||||
</div>
|
||||
<div class="supplement-list" id="supplementLogList"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="forms-grid" aria-label="Tracker forms">
|
||||
<form class="panel form-panel" id="workoutForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Schedule</p>
|
||||
<h2>Add Workout</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Date</span><input name="scheduled_on" type="date" required></label>
|
||||
<label class="field"><span>Routine</span><select name="routine_id"></select></label>
|
||||
<label class="field"><span>Exercise</span><select name="exercise_id"></select></label>
|
||||
<label class="field"><span>Workout type</span><input name="workout_type" list="workoutTypes" value="Weight lifting"></label>
|
||||
<label class="field wide"><span>Title</span><input name="title" placeholder="Push strength" required></label>
|
||||
<label class="field"><span>Sets</span><input name="sets" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Reps</span><input name="reps" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Weight lb</span><input name="weight_lbs" type="number" min="0" step="0.5"></label>
|
||||
<label class="field"><span>Minutes</span><input name="duration_min" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Miles</span><input name="distance_mi" type="number" min="0" step="0.01"></label>
|
||||
<label class="field"><span>Intensity</span><input name="intensity" placeholder="RPE 8"></label>
|
||||
<label class="field"><span>Status</span><select name="status"><option>planned</option><option>complete</option><option>skipped</option></select></label>
|
||||
<label class="field wide"><span>Notes</span><textarea name="notes" rows="3"></textarea></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save workout</button>
|
||||
</form>
|
||||
|
||||
<form class="panel form-panel" id="routineForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Program</p>
|
||||
<h2>Add Routine</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Name</span><input name="name" placeholder="Strength + swim" required></label>
|
||||
<label class="field"><span>Workout type</span><input name="workout_type" list="workoutTypes" value="Hybrid"></label>
|
||||
<label class="field"><span>Planner scope</span><select name="planner_scope"><option>daily</option><option selected>weekly</option><option>monthly</option></select></label>
|
||||
<label class="field"><span>Nutrition target</span><select name="nutrition_goal_id"></select></label>
|
||||
<label class="field"><span>Start date</span><input name="start_date" type="date" required></label>
|
||||
<label class="field"><span>Intensity</span><input name="intensity" placeholder="Moderate"></label>
|
||||
<label class="field wide"><span>Notes</span><textarea name="notes" rows="3"></textarea></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save routine</button>
|
||||
</form>
|
||||
|
||||
<form class="panel form-panel" id="nutritionGoalForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Targets</p>
|
||||
<h2>Add Nutrition Goal</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Label</span><input name="label" placeholder="Cutting day" required></label>
|
||||
<label class="field"><span>Scope</span><select name="scope"><option>daily</option><option>weekly</option><option>monthly</option></select></label>
|
||||
<label class="field"><span>Start date</span><input name="start_date" type="date" required></label>
|
||||
<label class="field"><span>Calories</span><input name="calories" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Protein g</span><input name="protein_g" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Carbs g</span><input name="carbs_g" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Fat g</span><input name="fat_g" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Water ml</span><input name="water_ml" type="number" min="0" step="50"></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save target</button>
|
||||
</form>
|
||||
|
||||
<form class="panel form-panel" id="nutritionLogForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Food</p>
|
||||
<h2>Log Nutrition</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Date</span><input name="logged_on" type="date" required></label>
|
||||
<label class="field"><span>Calories</span><input name="calories" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Protein g</span><input name="protein_g" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Carbs g</span><input name="carbs_g" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Fat g</span><input name="fat_g" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Water ml</span><input name="water_ml" type="number" min="0" step="50"></label>
|
||||
<label class="field wide"><span>Notes</span><textarea name="notes" rows="3"></textarea></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save nutrition</button>
|
||||
</form>
|
||||
|
||||
<form class="panel form-panel" id="supplementLogForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Dose</p>
|
||||
<h2>Log Supplement</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Date</span><input name="taken_on" type="date" required></label>
|
||||
<label class="field"><span>Supplement</span><select name="supplement_id"></select></label>
|
||||
<label class="field"><span>Timing</span><input name="timing" list="supplementTiming" value="Daily"></label>
|
||||
<label class="field"><span>Dose</span><input name="dose" placeholder="5 g"></label>
|
||||
<label class="field"><span>Status</span><select name="status"><option>planned</option><option>taken</option><option>skipped</option></select></label>
|
||||
<label class="field wide"><span>Notes</span><textarea name="notes" rows="3"></textarea></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save dose</button>
|
||||
</form>
|
||||
|
||||
<form class="panel form-panel" id="metricForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Health</p>
|
||||
<h2>Log Body Metrics</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Date</span><input name="measured_on" type="date" required></label>
|
||||
<label class="field"><span>Weight lb</span><input name="weight_lbs" type="number" min="0" step="0.1"></label>
|
||||
<label class="field"><span>Body fat %</span><input name="body_fat_pct" type="number" min="0" step="0.1"></label>
|
||||
<label class="field"><span>Sleep hr</span><input name="sleep_hours" type="number" min="0" step="0.1"></label>
|
||||
<label class="field"><span>Resting HR</span><input name="resting_hr" type="number" min="0" step="1"></label>
|
||||
<label class="field"><span>Mood</span><input name="mood" placeholder="Focused"></label>
|
||||
<label class="field wide"><span>Notes</span><textarea name="notes" rows="3"></textarea></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save metrics</button>
|
||||
</form>
|
||||
|
||||
<form class="panel form-panel" id="exerciseForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Exercises</p>
|
||||
<h2>Add Custom Exercise</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Name</span><input name="name" required></label>
|
||||
<label class="field"><span>Category</span><input name="category" list="workoutTypes" value="Custom"></label>
|
||||
<label class="field"><span>Muscle group</span><input name="muscle_group" placeholder="Back"></label>
|
||||
<label class="field"><span>Default unit</span><input name="default_unit" placeholder="sets x reps"></label>
|
||||
<label class="field wide"><span>Notes</span><textarea name="notes" rows="3"></textarea></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save exercise</button>
|
||||
</form>
|
||||
|
||||
<form class="panel form-panel" id="supplementForm">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Supplements</p>
|
||||
<h2>Add Custom Supplement</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid two">
|
||||
<label class="field"><span>Name</span><input name="name" required></label>
|
||||
<label class="field"><span>Timing</span><input name="timing" list="supplementTiming" value="Daily"></label>
|
||||
<label class="field"><span>Dose</span><input name="default_dose" placeholder="1 serving"></label>
|
||||
<label class="field"><span>Purpose</span><input name="purpose" placeholder="Recovery"></label>
|
||||
<label class="field wide"><span>Notes</span><textarea name="notes" rows="3"></textarea></label>
|
||||
</div>
|
||||
<button class="primary-button" type="submit">Save supplement</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="library-grid">
|
||||
<div class="panel">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Known Movements</p>
|
||||
<h2>Exercise Library</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chip-cloud" id="exerciseLibrary"></div>
|
||||
</div>
|
||||
<div class="panel">
|
||||
<div class="panel-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Known Stack</p>
|
||||
<h2>Supplement Library</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chip-cloud" id="supplementLibrary"></div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<datalist id="workoutTypes">
|
||||
<option value="Weight lifting"></option>
|
||||
<option value="Cycling"></option>
|
||||
<option value="Running"></option>
|
||||
<option value="Swimming"></option>
|
||||
<option value="Conditioning"></option>
|
||||
<option value="Mobility"></option>
|
||||
<option value="Hybrid"></option>
|
||||
<option value="Outdoor"></option>
|
||||
<option value="Core"></option>
|
||||
</datalist>
|
||||
<datalist id="supplementTiming">
|
||||
<option value="Pre-workout"></option>
|
||||
<option value="Intra-workout"></option>
|
||||
<option value="Post-workout"></option>
|
||||
<option value="Daily"></option>
|
||||
<option value="Evening"></option>
|
||||
</datalist>
|
||||
|
||||
<div class="toast" id="toast" role="status" aria-live="polite"></div>
|
||||
<script src="/assets/app.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user