summaryrefslogtreecommitdiff
path: root/static/css
diff options
context:
space:
mode:
authorMarius Peter <dev@marius-peter.com>2026-07-18 23:23:35 +0200
committerMarius Peter <dev@marius-peter.com>2026-07-18 23:23:35 +0200
commit753e25e99ddf57be78ff27ad89cb7e1bbc99d041 (patch)
tree43db69ec341520f2923f2f13d0cd8846a9acac35 /static/css
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 'static/css')
-rw-r--r--static/css/hito.css868
1 files changed, 868 insertions, 0 deletions
diff --git a/static/css/hito.css b/static/css/hito.css
new file mode 100644
index 0000000..1de9869
--- /dev/null
+++ b/static/css/hito.css
@@ -0,0 +1,868 @@
+/* HITO - Objectivist Aesthetic
+ Black. Gold. White. No compromise.
+ Rectilinear. Architectural. Certain.
+
+ "A is A." The design reflects the philosophy:
+ clarity, purpose, and respect for the rational mind. */
+
+/* === VARIABLES === */
+
+:root {
+ --bg: #0A0A0A;
+ --bg-raised: #111111;
+ --bg-input: #1A1A1A;
+ --fg: #F0EDE6;
+ --fg-dim: #9A958D;
+ --gold: #C5A24D;
+ --gold-dim: #8B7235;
+ --red: #8B0000;
+ --red-bright: #CC2200;
+ --green: #4A7A3A;
+ --mono: 'SF Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
+ --serif: Georgia, 'Times New Roman', 'Noto Serif', serif;
+ --sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+}
+
+/* === RESET === */
+
+*, *::before, *::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+/* === BASE === */
+
+html {
+ font-size: 17px;
+ line-height: 1.65;
+}
+
+body {
+ background-color: var(--bg);
+ color: var(--fg);
+ font-family: var(--serif);
+ min-height: 100vh;
+ display: flex;
+ justify-content: center;
+ padding: 2rem 1rem;
+}
+
+main {
+ max-width: 640px;
+ width: 100%;
+}
+
+/* === TYPOGRAPHY === */
+
+h1, h2, h3 {
+ font-family: var(--serif);
+ font-weight: normal;
+ letter-spacing: 0.05em;
+}
+
+h2 {
+ font-size: 1.6rem;
+ color: var(--gold);
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ margin-bottom: 1.5rem;
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--gold-dim);
+}
+
+h3 {
+ font-size: 1.1rem;
+ color: var(--fg);
+ margin-bottom: 0.5rem;
+}
+
+p {
+ margin-bottom: 1rem;
+}
+
+strong {
+ color: var(--gold);
+ font-weight: normal;
+ font-style: italic;
+}
+
+a {
+ color: var(--gold);
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+/* === HEADER === */
+
+header {
+ margin-bottom: 2.5rem;
+}
+
+.logo-link {
+ text-decoration: none;
+}
+
+.logo-link:hover {
+ text-decoration: none;
+}
+
+.logo {
+ font-size: 2.5rem;
+ letter-spacing: 0.3em;
+ text-transform: uppercase;
+ color: var(--gold);
+ margin-bottom: 0.1rem;
+ font-weight: normal;
+}
+
+.subtitle {
+ font-size: 0.75rem;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+ color: var(--fg-dim);
+ font-family: var(--mono);
+}
+
+/* === FOOTER / QUOTES === */
+
+footer {
+ margin-top: 3rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--bg-raised);
+}
+
+blockquote {
+ border-left: 2px solid var(--gold-dim);
+ padding-left: 1.25rem;
+ margin: 0;
+ font-style: italic;
+ color: var(--fg-dim);
+ font-size: 0.9rem;
+ line-height: 1.7;
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.75rem;
+ font-style: normal;
+ font-size: 0.8rem;
+ color: var(--gold-dim);
+ font-family: var(--mono);
+}
+
+/* === BUTTONS === */
+
+.btn-primary {
+ display: inline-block;
+ background-color: var(--gold);
+ color: var(--bg);
+ font-family: var(--mono);
+ font-size: 0.85rem;
+ font-weight: bold;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ padding: 0.9rem 2rem;
+ border: none;
+ cursor: pointer;
+ text-decoration: none;
+ margin-top: 1.5rem;
+ transition: background-color 0.15s;
+}
+
+.btn-primary:hover {
+ background-color: var(--fg);
+ text-decoration: none;
+}
+
+.btn-warning {
+ display: inline-block;
+ background-color: transparent;
+ color: var(--red-bright);
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.7rem 1.5rem;
+ border: 1px solid var(--red);
+ cursor: pointer;
+ text-decoration: none;
+ margin-top: 1.5rem;
+ transition: all 0.15s;
+}
+
+.btn-warning:hover {
+ background-color: var(--red);
+ color: var(--fg);
+ text-decoration: none;
+}
+
+.btn-danger {
+ display: inline-block;
+ background-color: var(--red);
+ color: var(--fg);
+ font-family: var(--mono);
+ font-size: 0.85rem;
+ font-weight: bold;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.9rem 2rem;
+ border: none;
+ cursor: pointer;
+ text-decoration: none;
+ margin-top: 1rem;
+ transition: background-color 0.15s;
+}
+
+.btn-danger:hover {
+ background-color: var(--red-bright);
+}
+
+.btn-secondary {
+ display: inline-block;
+ color: var(--fg-dim);
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.7rem 1.5rem;
+ border: 1px solid var(--fg-dim);
+ text-decoration: none;
+ margin-top: 1rem;
+ margin-left: 1rem;
+ transition: all 0.15s;
+}
+
+.btn-secondary:hover {
+ color: var(--fg);
+ border-color: var(--fg);
+ text-decoration: none;
+}
+
+/* === FORMS === */
+
+fieldset {
+ border: none;
+ margin-bottom: 2rem;
+ padding: 0;
+}
+
+legend {
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ color: var(--gold);
+ padding-bottom: 0.75rem;
+ margin-bottom: 1rem;
+ border-bottom: 1px solid var(--bg-raised);
+ width: 100%;
+ display: block;
+}
+
+label {
+ display: block;
+ font-size: 0.95rem;
+ margin-bottom: 0.25rem;
+ color: var(--fg);
+}
+
+input[type="number"],
+input[type="text"] {
+ background: var(--bg-input);
+ border: none;
+ border-bottom: 2px solid var(--fg-dim);
+ color: var(--fg);
+ font-family: var(--mono);
+ font-size: 1rem;
+ padding: 0.5rem 0.5rem;
+ width: 100%;
+ transition: border-color 0.15s;
+}
+
+input[type="number"]:focus,
+input[type="text"]:focus {
+ outline: none;
+ border-bottom-color: var(--gold);
+}
+
+input[type="number"]::placeholder {
+ color: var(--fg-dim);
+}
+
+.form-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 0.75rem;
+ gap: 1rem;
+}
+
+.form-row label {
+ flex: 1;
+ margin-bottom: 0;
+}
+
+.input-group {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+}
+
+.input-group input[type="number"] {
+ width: 5rem;
+ text-align: right;
+}
+
+.unit {
+ font-family: var(--mono);
+ font-size: 0.75rem;
+ color: var(--fg-dim);
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+/* === INSTRUCTIONS === */
+
+.instruction {
+ font-size: 0.9rem;
+ line-height: 1.7;
+ color: var(--fg);
+ margin-bottom: 1rem;
+}
+
+.instruction.secondary {
+ color: var(--fg-dim);
+ font-size: 0.85rem;
+ margin-bottom: 2rem;
+}
+
+/* === DASHBOARD === */
+
+.dashboard .status {
+ margin-bottom: 2.5rem;
+}
+
+.status.ready h2 {
+ color: var(--gold);
+ border-bottom: none;
+ padding-bottom: 0;
+ margin-bottom: 0.75rem;
+}
+
+.status.recovering h2 {
+ color: var(--red-bright);
+ border-bottom: none;
+ padding-bottom: 0;
+ margin-bottom: 1rem;
+}
+
+.next-workout {
+ font-size: 1.1rem;
+ margin-bottom: 0.5rem;
+}
+
+.days-remaining {
+ display: flex;
+ align-items: baseline;
+ gap: 0.75rem;
+ margin-bottom: 1rem;
+}
+
+.big-number {
+ font-family: var(--mono);
+ font-size: 3rem;
+ color: var(--red-bright);
+ line-height: 1;
+}
+
+.days-remaining .label {
+ font-family: var(--mono);
+ font-size: 0.85rem;
+ color: var(--fg-dim);
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+}
+
+.next-date {
+ font-size: 0.95rem;
+ margin-bottom: 0.5rem;
+}
+
+.recovery-reason {
+ font-size: 0.85rem;
+ color: var(--fg-dim);
+ font-style: italic;
+}
+
+/* === SESSION HISTORY === */
+
+.history {
+ margin-top: 2.5rem;
+ padding-top: 1.5rem;
+ border-top: 1px solid var(--bg-raised);
+}
+
+.history h3 {
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ color: var(--fg-dim);
+ margin-bottom: 1rem;
+}
+
+.history-entry {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 0.5rem 0;
+ border-bottom: 1px solid var(--bg-raised);
+ font-size: 0.9rem;
+}
+
+.history-date {
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ color: var(--fg-dim);
+ min-width: 6rem;
+}
+
+.history-day {
+ color: var(--fg);
+}
+
+.history-badge {
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.15rem 0.4rem;
+}
+
+.history-badge.override {
+ color: var(--red-bright);
+ border: 1px solid var(--red);
+}
+
+/* === SESSION / WORKOUT === */
+
+.session {
+ margin-bottom: 2rem;
+}
+
+.exercise-group {
+ margin-bottom: 2rem;
+ padding: 0;
+ border: none;
+}
+
+.exercise-group.superset {
+ border-left: 3px solid var(--gold-dim);
+ padding-left: 1.25rem;
+}
+
+.group-label {
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ color: var(--gold-dim);
+ padding: 0;
+ margin-bottom: 1rem;
+ border: none;
+ width: auto;
+}
+
+.exercise-entry {
+ margin-bottom: 1.5rem;
+}
+
+.exercise-name {
+ font-size: 1.05rem;
+ color: var(--fg);
+ margin-bottom: 0.25rem;
+ font-weight: normal;
+}
+
+.prescription {
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ color: var(--fg-dim);
+ margin-bottom: 0.75rem;
+}
+
+.prescription strong {
+ color: var(--gold);
+ font-style: normal;
+}
+
+.set-row {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ margin-bottom: 0.5rem;
+ padding: 0.4rem 0;
+}
+
+.set-label {
+ font-family: var(--mono);
+ font-size: 0.75rem;
+ color: var(--fg-dim);
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ min-width: 3rem;
+}
+
+.set-row .input-group input[type="number"] {
+ width: 4.5rem;
+}
+
+.failure-check {
+ display: flex;
+ align-items: center;
+ gap: 0.3rem;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ color: var(--fg-dim);
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ cursor: pointer;
+}
+
+.failure-check input[type="checkbox"] {
+ accent-color: var(--gold);
+ width: 1rem;
+ height: 1rem;
+}
+
+/* === SESSION COMPLETE === */
+
+.session-complete {
+ margin-bottom: 2rem;
+}
+
+.progression-results {
+ margin-bottom: 2rem;
+}
+
+.result-entry {
+ padding: 0.75rem 0;
+ border-bottom: 1px solid var(--bg-raised);
+}
+
+.result-entry .exercise-name {
+ display: block;
+ font-size: 0.9rem;
+ color: var(--fg);
+ margin-bottom: 0.25rem;
+}
+
+.result-entry .result-text {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--fg-dim);
+ font-style: italic;
+}
+
+.result-entry.increase .result-text {
+ color: var(--gold);
+}
+
+.result-entry.stall .result-text {
+ color: var(--red-bright);
+}
+
+.summary {
+ font-family: var(--mono);
+ font-size: 0.85rem;
+ letter-spacing: 0.05em;
+ margin-bottom: 0.5rem;
+}
+
+.summary.increase {
+ color: var(--gold);
+}
+
+.summary.stall {
+ color: var(--red-bright);
+}
+
+.recovery-info {
+ margin-top: 2rem;
+ padding-top: 1.5rem;
+ border-top: 1px solid var(--bg-raised);
+}
+
+.recovery-info h3 {
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ color: var(--fg-dim);
+ margin-bottom: 0.75rem;
+}
+
+.recovery-info p {
+ font-size: 0.9rem;
+}
+
+/* === OVERRIDE PAGE === */
+
+.override-page {
+ margin-bottom: 2rem;
+}
+
+.override-page h2 {
+ color: var(--red-bright);
+ border-bottom-color: var(--red);
+}
+
+.warning-block {
+ border-left: 3px solid var(--red);
+ padding: 1.25rem 1.25rem;
+ background: var(--bg-raised);
+ margin: 1.5rem 0;
+}
+
+.warning-text {
+ font-size: 0.9rem;
+ line-height: 1.8;
+ color: var(--fg);
+ margin-bottom: 0;
+}
+
+.override-info {
+ margin: 1.5rem 0;
+ font-size: 0.9rem;
+}
+
+.override-actions {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+
+/* === SETUP PAGE === */
+
+.setup fieldset {
+ margin-bottom: 2.5rem;
+}
+
+.setup legend {
+ font-size: 0.85rem;
+}
+
+/* === RESPONSIVE === */
+
+@media (max-width: 480px) {
+ html {
+ font-size: 15px;
+ }
+
+ body {
+ padding: 1.5rem 0.75rem;
+ }
+
+ .logo {
+ font-size: 2rem;
+ }
+
+ .form-row {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.4rem;
+ }
+
+ .set-row {
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ }
+
+ .set-row .input-group input[type="number"] {
+ width: 4rem;
+ }
+
+ .override-actions {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .btn-secondary {
+ margin-left: 0;
+ text-align: center;
+ }
+
+ .history-entry {
+ flex-wrap: wrap;
+ gap: 0.4rem;
+ }
+
+ .days-remaining {
+ flex-direction: column;
+ gap: 0.25rem;
+ }
+}
+
+
+
+/* === EXERCISES PAGE === */
+
+.exercises-page {
+ margin-bottom: 2rem;
+}
+
+.exercise-day {
+ margin-bottom: 2.5rem;
+}
+
+.day-header {
+ font-family: var(--mono);
+ font-size: 0.85rem;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ color: var(--gold);
+ margin-bottom: 1rem;
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--bg-raised);
+}
+
+.exercise-slot {
+ padding: 0.75rem 0;
+ border-bottom: 1px solid var(--bg-raised);
+}
+
+.slot-current {
+ margin-bottom: 0.5rem;
+}
+
+.slot-canonical {
+ color: var(--fg);
+ font-size: 0.95rem;
+}
+
+.slot-active {
+ color: var(--gold);
+ font-size: 0.9rem;
+ font-style: italic;
+ margin-left: 0.5rem;
+}
+
+.swap-form {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.swap-form select {
+ background: var(--bg-input);
+ border: none;
+ border-bottom: 2px solid var(--fg-dim);
+ color: var(--fg);
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ padding: 0.4rem 0.5rem;
+ flex: 1;
+ max-width: 20rem;
+}
+
+.swap-form select:focus {
+ outline: none;
+ border-bottom-color: var(--gold);
+}
+
+.btn-swap {
+ background: transparent;
+ color: var(--gold-dim);
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.35rem 0.75rem;
+ border: 1px solid var(--gold-dim);
+ cursor: pointer;
+ transition: all 0.15s;
+}
+
+.btn-swap:hover {
+ color: var(--gold);
+ border-color: var(--gold);
+}
+
+
+
+/* === NAV LINKS === */
+
+.nav-links {
+ margin-top: 2rem;
+ padding-top: 1rem;
+ border-top: 1px solid var(--bg-raised);
+}
+
+.nav-links a {
+ font-family: var(--mono);
+ font-size: 0.8rem;
+ letter-spacing: 0.05em;
+ color: var(--fg-dim);
+}
+
+.nav-links a:hover {
+ color: var(--gold);
+}
+
+
+
+/* === SETUP LEVEL SELECTION === */
+
+.level-choices {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ margin: 2rem 0;
+}
+
+.level-choice {
+ cursor: pointer;
+ display: block;
+}
+
+.level-choice input[type="radio"] {
+ position: absolute;
+ opacity: 0;
+ pointer-events: none;
+}
+
+.choice-card {
+ border: 2px solid var(--bg-raised);
+ padding: 1.25rem 1.5rem;
+ transition: border-color 0.15s, background-color 0.15s;
+}
+
+.level-choice input[type="radio"]:checked + .choice-card {
+ border-color: var(--gold);
+ background-color: var(--bg-raised);
+}
+
+.level-choice:hover .choice-card {
+ border-color: var(--gold-dim);
+}
+
+.choice-title {
+ display: block;
+ font-family: var(--mono);
+ font-size: 0.9rem;
+ letter-spacing: 0.15em;
+ color: var(--gold);
+ margin-bottom: 0.4rem;
+}
+
+.choice-desc {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--fg-dim);
+ line-height: 1.6;
+}
Copyright 2019--2026 Marius PETER