diff options
| author | Marius Peter <dev@marius-peter.com> | 2026-07-18 23:23:35 +0200 |
|---|---|---|
| committer | Marius Peter <dev@marius-peter.com> | 2026-07-18 23:23:35 +0200 |
| commit | 753e25e99ddf57be78ff27ad89cb7e1bbc99d041 (patch) | |
| tree | 43db69ec341520f2923f2f13d0cd8846a9acac35 /templates | |
Initial commit: HITO MVP
Heavy Duty I prescriptive training system encoding Mentzer's methodology.
- 4-day split program (Chest & Back, Legs, Shoulders, Arms)
- Prescription engine with pre-exhaust superset structure
- Strict progression logic (+5kg large / +2.5kg small muscles)
- Recovery gating with stall-based extension and override
- Onboarding via experience level (Novice/Intermediate/Advanced)
- Session logging with full progression analysis
- Exercise substitution (33 alternatives for 17 canonical movements)
- Objectivist aesthetic: black/gold, serif, rectilinear
Stack: Hunchentoot, Mito/SQLite, Djula, SBCL
Diffstat (limited to 'templates')
| -rw-r--r-- | templates/base.html | 29 | ||||
| -rw-r--r-- | templates/dashboard.html | 63 | ||||
| -rw-r--r-- | templates/exercises.html | 62 | ||||
| -rw-r--r-- | templates/override.html | 33 | ||||
| -rw-r--r-- | templates/session-complete.html | 46 | ||||
| -rw-r--r-- | templates/session.html | 80 | ||||
| -rw-r--r-- | templates/setup.html | 56 |
7 files changed, 369 insertions, 0 deletions
diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..472d827 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>HITO{% block title %}{% endblock %}</title> + <link rel="stylesheet" href="/static/css/hito.css"> +</head> +<body> + <main> + <header> + <a href="/" class="logo-link"><h1 class="logo">HITO</h1></a> + <p class="subtitle">High Intensity Tracker Online</p> + </header> + + {% block content %}{% endblock %} + + <footer> + {% block quote %} + <blockquote> + “The objective of all rational inquiry is to establish principles + which enable us to understand and predict reality.” + <cite>— Mike Mentzer</cite> + </blockquote> + {% endblock %} + </footer> + </main> +</body> +</html> diff --git a/templates/dashboard.html b/templates/dashboard.html new file mode 100644 index 0000000..da294ee --- /dev/null +++ b/templates/dashboard.html @@ -0,0 +1,63 @@ +{% extends "base.html" %} + +{% block title %} — Dashboard{% endblock %} + +{% block content %} +<section class="dashboard"> + + {% if ready %} + <div class="status ready"> + <h2>YOU ARE READY</h2> + <p class="next-workout">Today you train <strong>Day {{ next_day }}: {{ next_day_name }}</strong>.</p> + <a href="/session" class="btn-primary">BEGIN SESSION</a> + </div> + {% else %} + <div class="status recovering"> + <h2>RECOVERY IN PROGRESS</h2> + <p class="days-remaining"> + <span class="big-number">{{ days_remaining }}</span> + <span class="label">day{{ days_plural }} remaining</span> + </p> + <p class="next-date">Next session prescribed for <strong>{{ next_date }}</strong>.</p> + <p class="recovery-reason">{{ reason }}</p> + <a href="/override" class="btn-warning">OVERRIDE RECOVERY</a> + </div> + {% endif %} + + {% if has_history %} + <div class="history"> + <h3>Recent Sessions</h3> + {% for session in sessions %} + <div class="history-entry"> + <span class="history-date">{{ session.date }}</span> + <span class="history-day">Day {{ session.day }}: {{ session.day_name }}</span> + {% if session.override %} + <span class="history-badge override">OVERRIDE</span> + {% endif %} + </div> + {% endfor %} + </div> + {% endif %} + + <div class="nav-links"> + <a href="/exercises">Configure Exercises</a> + </div> + +</section> +{% endblock %} + +{% block quote %} +{% if ready %} +<blockquote> + “Every single workout must be a step forward if you are to get anywhere + with your training.” + <cite>— Mike Mentzer</cite> +</blockquote> +{% else %} +<blockquote> + “Rest is not a sign of weakness. It is the very process by which + the body grows stronger.” + <cite>— Mike Mentzer</cite> +</blockquote> +{% endif %} +{% endblock %} diff --git a/templates/exercises.html b/templates/exercises.html new file mode 100644 index 0000000..cd7aa54 --- /dev/null +++ b/templates/exercises.html @@ -0,0 +1,62 @@ +{% extends "base.html" %} + +{% block title %} — Exercises{% endblock %} + +{% block content %} +<section class="exercises-page"> + <h2>Exercise Configuration</h2> + + <p class="instruction"> + The movement pattern is what matters. Select an equivalent exercise + if your facility requires it. The program structure is preserved regardless + of which specific implement you use. + </p> + + {% for day in days %} + <div class="exercise-day"> + <h3 class="day-header">Day {{ day.number }}: {{ day.name }}</h3> + + {% for slot in day.slots %} + <div class="exercise-slot"> + <div class="slot-current"> + <span class="slot-canonical">{{ slot.canonical_name }}</span> + {% if slot.has_substitute %} + <span class="slot-active">→ {{ slot.active_name }}</span> + {% endif %} + </div> + + {% if slot.options %} + <form method="post" action="/exercises/swap" class="swap-form"> + <input type="hidden" name="canonical-id" value="{{ slot.canonical_id }}"> + <select name="substitute-id"> + <option value="0" + {% ifequal slot.active_id slot.canonical_id %}selected{% endifequal %}> + {{ slot.canonical_name }} (default) + </option> + {% for option in slot.options %} + <option value="{{ option.id }}" + {% ifequal option.id slot.active_id %}selected{% endifequal %}> + {{ option.name }} + </option> + {% endfor %} + </select> + <button type="submit" class="btn-swap">SWAP</button> + </form> + {% endif %} + </div> + {% endfor %} + </div> + {% endfor %} + + <a href="/" class="btn-secondary">RETURN TO DASHBOARD</a> +</section> +{% endblock %} + +{% block quote %} +<blockquote> + “The specific exercise is less important than the principle it serves. + What matters is that the target muscle is worked to failure through a full + range of motion.” + <cite>— Mike Mentzer</cite> +</blockquote> +{% endblock %} diff --git a/templates/override.html b/templates/override.html new file mode 100644 index 0000000..02b6a3c --- /dev/null +++ b/templates/override.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} + +{% block title %} — Override Recovery{% endblock %} + +{% block content %} +<section class="override-page"> + <h2>OVERRIDE RECOVERY GATE</h2> + + <div class="warning-block"> + <p class="warning-text">{{ warning }}</p> + </div> + + <div class="override-info"> + <p>Days remaining in prescribed recovery: <strong>{{ days_remaining }}</strong></p> + <p>Recommended next session: <strong>{{ next_date }}</strong></p> + </div> + + <form method="post" action="/override/confirm"> + <div class="override-actions"> + <button type="submit" class="btn-danger">I UNDERSTAND. PROCEED.</button> + <a href="/" class="btn-secondary">RETURN TO DASHBOARD</a> + </div> + </form> +</section> +{% endblock %} + +{% block quote %} +<blockquote> + “To act against one’s own rational judgment is to act against + one’s own interests.” + <cite>— Mike Mentzer</cite> +</blockquote> +{% endblock %} diff --git a/templates/session-complete.html b/templates/session-complete.html new file mode 100644 index 0000000..8cd18b3 --- /dev/null +++ b/templates/session-complete.html @@ -0,0 +1,46 @@ +{% extends "base.html" %} + +{% block title %} — Session Complete{% endblock %} + +{% block content %} +<section class="session-complete"> + <h2>Session Complete</h2> + + <div class="progression-results"> + {% for result in results %} + <div class="result-entry {{ result.status }}"> + <span class="exercise-name">{{ result.exercise_name }}</span> + <span class="result-text">{{ result.text }}</span> + </div> + {% endfor %} + </div> + + {% if has_increases %} + <p class="summary increase"> + Weight increased on {{ increase_count }} exercise{{ increase_plural }}. + </p> + {% endif %} + + {% if has_stalls %} + <p class="summary stall"> + {{ stall_count }} stall{{ stall_plural }} detected. Extended recovery is indicated. + </p> + {% endif %} + + <div class="recovery-info"> + <h3>Recovery</h3> + <p>Your next session is prescribed for <strong>{{ next_date }}</strong>.</p> + <p class="recovery-reason">{{ recovery_reason }}</p> + </div> + + <a href="/" class="btn-primary">RETURN TO DASHBOARD</a> +</section> +{% endblock %} + +{% block quote %} +<blockquote> + “The muscles grow during rest, not during training. Training is merely + the stimulus; rest is where adaptation occurs.” + <cite>— Mike Mentzer</cite> +</blockquote> +{% endblock %} diff --git a/templates/session.html b/templates/session.html new file mode 100644 index 0000000..c419697 --- /dev/null +++ b/templates/session.html @@ -0,0 +1,80 @@ +{% extends "base.html" %} + +{% block title %} — Day {{ day_number }}: {{ day_name }}{% endblock %} + +{% block content %} +<section class="session"> + <h2>Day {{ day_number }}: {{ day_name }}</h2> + + <p class="instruction"> + Perform each set to momentary muscular failure within the prescribed rep range. + Record the weight used and repetitions achieved. Do not exceed the prescribed sets. + </p> + + <form method="post" action="/session/submit"> + {% for group in groups %} + <fieldset class="exercise-group {{ group.type }}"> + {% ifequal group.type "superset" %} + <legend class="group-label">Pre-Exhaust Superset</legend> + {% else %} + <legend class="group-label">Straight Set</legend> + {% endifequal %} + + {% for exercise in group.exercises %} + <div class="exercise-entry"> + <h3 class="exercise-name">{{ exercise.name }}</h3> + <p class="prescription"> + Target: <strong>{{ exercise.target_weight }} kg</strong> × + <strong>{{ exercise.rep_low }}–{{ exercise.rep_high }}</strong> reps + </p> + + {% for set in exercise.sets %} + <div class="set-row"> + <span class="set-label">Set {{ set.number }}</span> + <input type="hidden" name="exercise-id-{{ set.field_key }}" value="{{ exercise.id }}"> + <input type="hidden" name="set-number-{{ set.field_key }}" value="{{ set.number }}"> + <input type="hidden" name="prescribed-weight-{{ set.field_key }}" value="{{ exercise.target_weight }}"> + <div class="input-group"> + <input type="number" + name="actual-weight-{{ set.field_key }}" + value="{{ exercise.target_weight }}" + min="0" + step="2.5" + required> + <span class="unit">kg</span> + </div> + <div class="input-group"> + <input type="number" + name="actual-reps-{{ set.field_key }}" + min="0" + max="30" + placeholder="reps" + required> + <span class="unit">reps</span> + </div> + <label class="failure-check"> + <input type="checkbox" + name="to-failure-{{ set.field_key }}" + value="1" + checked> + Failure + </label> + </div> + {% endfor %} + </div> + {% endfor %} + </fieldset> + {% endfor %} + + <button type="submit" class="btn-primary">LOG SESSION</button> + </form> +</section> +{% endblock %} + +{% block quote %} +<blockquote> + “One set of an exercise, carried to a point of momentary muscular failure, + is all that is required to stimulate an increase in strength and size.” + <cite>— Mike Mentzer</cite> +</blockquote> +{% endblock %} diff --git a/templates/setup.html b/templates/setup.html new file mode 100644 index 0000000..3653c06 --- /dev/null +++ b/templates/setup.html @@ -0,0 +1,56 @@ +{% extends "base.html" %} + +{% block title %} — Setup{% endblock %} + +{% block content %} +<section class="setup"> + <h2>Begin</h2> + + <p class="instruction"> + Select your training experience level. This determines your starting weights. + The system will correct them rapidly through training — err on the side of + caution. Ego has no place here. + </p> + + <form method="post" action="/setup/submit"> + <div class="level-choices"> + <label class="level-choice"> + <input type="radio" name="level" value="beginner" checked> + <div class="choice-card"> + <span class="choice-title">NOVICE</span> + <span class="choice-desc">Under 1 year of serious training.<br> + Learning proper form and building base strength.</span> + </div> + </label> + + <label class="level-choice"> + <input type="radio" name="level" value="intermediate"> + <div class="choice-card"> + <span class="choice-title">INTERMEDIATE</span> + <span class="choice-desc">1–3 years of consistent training.<br> + Comfortable with compound movements under load.</span> + </div> + </label> + + <label class="level-choice"> + <input type="radio" name="level" value="advanced"> + <div class="choice-card"> + <span class="choice-title">ADVANCED</span> + <span class="choice-desc">3+ years of dedicated training.<br> + Near or past initial strength plateaus.</span> + </div> + </label> + </div> + + <button type="submit" class="btn-primary">BEGIN TRAINING</button> + </form> +</section> +{% endblock %} + +{% block quote %} +<blockquote> + “The first step in any rational endeavor is to identify the facts of reality + relevant to one’s purpose.” + <cite>— Mike Mentzer</cite> +</blockquote> +{% endblock %} |